/*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
  |  Implementação de uma Matriz Dinâmica  |
  |________________________________________|*/

// É Linux ou é Windows?
#ifdef linux      // Sistema Operacional: Linux.
    #define sistema_operacional 0
#else
    #ifdef _WIN32 // Sistema Operacional: Windows.
        #define sistema_operacional 1
    #endif
#endif
// Vixe! Não é nenhum dos 2...
#ifndef sistema_operacional
    #error Sistema Operacional desconhecido!!! So rodo no Linux ou no Windows!!!
#endif

/*** LIXUX - INCLUDES E DEFINES ***/
#if (sistema_operacional == 0)
    #include "Extras/fuba_linux.h"
#endif

/*** WINDOWS - INCLUDES E DEFINES ***/
#if (sistema_operacional == 1)
    #include "Extras/fuba_win.h"
#endif

/*** DEFINES do programa ***/
// NADA!

/*** INCLUDES do programa ***/
#include <iostream>

// Classes:
#include "Classes/matriz.h"
using namespace std;

int main(void) // PRINCIPAL //
{
    // Variáveis do MAIN:
    char escolha = '\0';
    int linha, coluna;
    double valor;
    matriz M;

    do{// MENU PRINCIPAL //
        limpar_tela();
        cout <<"#=============================================================#"<<endl;
        cout <<"#                  [Testes da Classe Matriz]                  #"<<endl;
        cout <<"#=============================================================#"<<endl;
        cout <<"> Matriz \"M\": "<<M.get_linhas()<<" x "<<M.get_colunas()<<endl;
        cout <<"> Escolha:"<<endl;
        cout <<"  (1) Alocar a matriz;"<<endl;
        cout <<"  (2) Desalocar a matriz;"<<endl;
        cout <<"  (3) Checar se a matriz esta alocada;"<<endl;
        cout <<" -------------------------------------------------"<<endl;
        cout <<"  (4) Setar todos os elementos com um valor dado;"<<endl;
        cout <<"  (5) Inserir os elementos da matriz;"<<endl;
        cout <<"  (6) Tornar matriz Identidade;"<<endl;
        cout <<"  (7) Tornar matriz Transposta;"<<endl;
        cout <<"  (8) Multiplicar matriz por escalar;"<<endl;
        cout <<" -------------------------------------------------"<<endl;
        cout <<"  (i) Imprimir a matriz;"<<endl;
        cout <<"  (X) Sair do programa."<<endl;
        escolha = ler_tecla();
        switch(escolha)
        {
            case '1':
            {
                limpar_tela();
                cout <<"+-------------------+"<<endl;
                cout <<"|  Alocar a matriz  |"<<endl;
                cout <<"+-------------------+"<<endl;
                cout <<"* Digite o numero de linhas: ";
                cin >> linha;
                cout <<"* Digite o numero de colunas: ";
                cin >> coluna;
                M.alocar(linha,coluna);
                pausar();
                break;
            }

            case '2':
            {
                limpar_tela();
                cout <<"+----------------------+"<<endl;
                cout <<"|  Desalocar a matriz  |"<<endl;
                cout <<"+----------------------+"<<endl;
                M.desalocar();
                cout<<"> A matriz foi desalocada (ou seja, seus elementos foram deletados)."<<endl;
                pausar();
                break;
            }

            case '3':
            {
                limpar_tela();
                cout <<"+-------------------+"<<endl;
                cout <<"|  Matriz alocada?  |"<<endl;
                cout <<"+-------------------+"<<endl;
                cout<<"> A matriz esta ";
                if (M.checar_alocada())
                    cout<<"alocada!"<<endl;
                else
                    cout<<"desalocada."<<endl;
                pausar();
                break;
            }

            case '4':
            {
                limpar_tela();
                cout <<"+----------------------------+"<<endl;
                cout <<"|  Setar todos os elementos  |"<<endl;
                cout <<"+----------------------------+"<<endl;
                cout <<"* Digite o valor: ";
                cin >> valor;
                M.set_todos_aij(valor);
                break;
            }

            case '5':
            {
                limpar_tela();
                cout <<"+----------------------------------+"<<endl;
                cout <<"|  Inserir os elementos da matriz  |"<<endl;
                cout <<"+----------------------------------+"<<endl;
                cout <<"> Matriz \"M\": "<<M.get_linhas()<<" x "<<M.get_colunas()<<endl;
                for(int i=0 ; i<(M.get_linhas()) ; i++)
                {
                    for(int j=0 ; j<(M.get_colunas()) ; j++)
                    {
                        cout <<"* Digite o elemento M["<<i<<","<<j<<"]: ";
                        cin >> valor;
                        M.set_aij(i,j,valor);
                    }
                }
                break;
            }

            case '6':
            {
                limpar_tela();
                cout <<"+----------------------------+"<<endl;
                cout <<"|  Tornar matriz Identidade  |"<<endl;
                cout <<"+----------------------------+"<<endl;
                if (M.tornar_identidade())
                    cout<<"> A matriz tornou-se uma matriz Identidade."<<endl;
                pausar();
                break;
            }

            case '7':
            {
                limpar_tela();
                cout <<"+----------------------------+"<<endl;
                cout <<"|  Tornar matriz Transposta  |"<<endl;
                cout <<"+----------------------------+"<<endl;
                M.imprimir();
                if (M.tornar_transposta())
                {
                    cout<<"> A matriz tornou-se uma matriz Transposta:"<<endl;
                    M.imprimir();
                }
                pausar();
                break;
            }

            case '8':
            {
                limpar_tela();
                cout <<"+----------------------------------+"<<endl;
                cout <<"|  Multiplicar matriz por escalar  |"<<endl;
                cout <<"+----------------------------------+"<<endl;
                M.imprimir();
                cout <<"* Digite o valor: ";
                cin >> valor;
                M.multiplicar_escalar(valor);
                M.imprimir();
                pausar();
                break;
            }

            case 'I':
            {
                limpar_tela();
                cout <<"+---------------------+"<<endl;
                cout <<"|  Imprimir a matriz  |"<<endl;
                cout <<"+---------------------+"<<endl;
                M.imprimir();
                pausar();
                break;
            }
        }// fim do "switch(escolha)" //
      }while(escolha!='X');// fim do "MENU PRINCIPAL" //
    return(0);
}
